Visual Theme

th <- theme(axis.title = element_text(family = "Montserrat-Italic", color = "#000000", size = 12),
            axis.text = element_text(family = "Montserrat", color = "#000000", size = 12),
            panel.background = element_rect(fill = "#f2f2f2"),
            panel.grid.major = element_line (color = "#FFFFFF", size = 0.5),
            panel.grid.minor = element_line (color = "#FFFFFF", size = 0.1),
            plot.title = element_text(family = "Montserrat", color = "#000000", size = 18),
            plot.subtitle = element_text(family = "Montserrat", color = "#000000", size = 14),
            plot.caption = element_text(family = "Montserrat", color = "#000000", size = 10),
            legend.text = element_text(family = "Montserrat", color = "#000000", size = 10),
            legend.title = element_text(family = "Montserrat", color = "#000000", size = 12),
            strip.text =  element_text(family = "Montserrat", color = "#000000", size = 10))
            #plot.tag = element_text(family = "Montserrat", color = "#000000", size = 10))

Main Categorical Colors

Colors are drawn from the Sustainable Development Goals given their prominance in the development space and the direct reference to the Goals in the discussion of development priorities in the graphs.

Blue: #2699D0 Green: #4CA145 Orange: #F69D30 Pink: #E31480 Red: #C42231 Gray: #6a6a6a

NA color: Dark Gray: #424242

Blue Scale - 6: c(“#125169”, “#206b8c”, “#2699D0”, “#5aa1c8”, “#7fbdde”, “#a9d9ef”) Blue Scale - 3 c(“#125169”, “#2699D0”, “#a9d9ef”)

Orange Scale - 6: c(“#b83d05”, “#c95714”, “#F69D30”, “#e78938”, “#f3a352”, “#fabe7a”) Orange Scale - 3 c(“#b83d05”, “#F89E37”, “#fabe7a”)

Diverging 6-point scale: c(“#125169”, “#2699D0”, “#a9d9ef”,“#fabe7a”, “#F89E37”, “#b83d05”)

Plot 1: How does development project performance vary by region?

data %>%
  filter(completion_year > 2000) %>%
  select(region, performance_cat, satisfactory) %>%
  group_by(region, performance_cat) %>%
  summarise(
    count = n()
  ) %>%
  filter(!is.na(region) & region != "Northern America") %>%
  ggplot(aes(x = region , y = count,fill = fct_rev(performance_cat))) + 
  geom_bar(position = "fill",stat = "identity") +
  scale_y_continuous(labels = percent_format(), expand = c(0, 0)) +
  scale_fill_manual(values = c("#125169", "#2699D0", "#a9d9ef","#fabe7a", "#F89E37", "#b83d05"), na.value = "#424242") + 
  th +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  labs(x = "Region", y = "Percentage of Projects (Completion Date 2000-2015)", fill = "Project Performance Category",
       title = "The Majority of Development Projects are Satisfactory Across Nearly All Regions", 
       subtitle = "Eastern Asia leads in performance while Micronesia and Melanesia have majority unsatisfactory projects",
       caption = "Source: Project Performance Database (Honig 2018)") 

Development projects from 2000-2015 overwhelmingly received satisfactory ratings, with most regions having nearly three quarters of all projects rated “marginally satisfactory”, “satisfactory”, or “highly satisfactory”. Melanesia and Micronesia are the notable exceptions to this trend, with the majority of projects evaluated to be “marginally unsatisfactory”, “unsatisfactory”, or “highly unsatisfactory”. It is possible that project performance is hindered by the difficult implementation conditions of small island nations hinders or the relatively limited donor experince in these regions (due to the smaller number of projects). Eastern Asia leads all regions in project success, with the fewest projects receiving ratings on the unsatisfactory half of the scale, and the most projects receiving the top “highly satisfactory” rating.

Plot 2: What countries have a disproportionate share of unsatisfactory projects?

d_split <- data %>% 
  filter(completion_year > 2000) %>%
  select(country_name, continent, satisfactory, unsatisfactory) %>%
  group_by_at(c("country_name", "continent")) %>%
  summarise(
    count_all = n(),
    count_satisfactory = sum(satisfactory, na.rm = TRUE),
    count_unsatisfactory = sum(unsatisfactory, na.rm = TRUE),
    pct_satisfactory = count_satisfactory/count_all,
    pct_unsatisfactory = count_unsatisfactory/count_all
  ) %>% 
  filter(!is.na(country_name))

top20 <- d_split %>% arrange(desc(pct_unsatisfactory))
top20 <- top20[1:20,]
top20 <- top20 %>% 
  select(country_name, continent, pct_unsatisfactory) %>% 
  as.data.frame() %>%
  add_row(country_name = 'Global Average', continent = "Global Average", pct_unsatisfactory = mean(d_split$pct_unsatisfactory))
top20$country_name[top20$country_name == "Micronesia (Federated States of)"] <- "Micronesia"

### Most disproportionate unsatisfactory projects ###

ggplot(top20, aes(x=reorder(country_name, pct_unsatisfactory), y=pct_unsatisfactory, label=pct_unsatisfactory)) + 
  geom_bar(stat='identity', aes(fill= continent), width=.5)  +
  scale_fill_manual(values = c("#2699D0", "#F69D30", "#E31480", "#4CA145", "#6a6a6a")) +
  labs( x = "Country", y = "Percentage of Projects Unsatisfactory (2000-2015)", 
        title ="Nauru, Botswana Have the Largest Proportion of Unsatisfactory Projects", 
        subtitle = "The 20 countries with the highest proportion of unsatisfactory projects are concentrated \n in Africa and New Zealand + Oceania",
        fill = "Continent", 
        caption = "Source: Project Performance Database (Honig 2018)") +
  th +
  geom_text(aes(label=paste(round(pct_unsatisfactory*100,2),'%', '')), size =3, position=position_dodge(width=0.9), hjust= -0.04, family = "Montserrat") +
  scale_y_continuous(labels = percent_format(), expand = c(.06, .06)) +
  coord_flip() 

To dig deeper into the geographic distribution of project performance, we examine the countries that have the highest proportion of unsatisfactory projects. Two key findings jump out: first, all projects in Nauru and Botswana captured in the databse since 2000 are unsatisfactory, though these results must be interpreted with caution given the small number of projects (n = 1 and n = 5 respectively). Second, even though all regions of Africa had less than 30% unsuccessful projects overall, we see several African countries on the top 20 list. This begs further exploration into the determinants of project performance in these countries.

Plot 4: Do leader and donor development priorities align in Ghana?

# reshape data for ghana and rank SDGs by total funding
data_sdg_ghana <- data_sdg %>%
  filter(country_name == "Ghana" & completion_year > 2005) %>%
  select(aiddata_id, goal_1, goal_2, goal_3, goal_4, goal_5, goal_6, goal_7, goal_8, goal_9, goal_10, goal_11, goal_12, goal_13,
         goal_14, goal_15, goal_16, goal_17, six_overall_rating) %>%
  gather(key = "goal", value = "funding", goal_1, goal_2, goal_3, goal_4, goal_5, goal_6, goal_7, goal_8, goal_9, goal_10, goal_11, goal_12, goal_13,
         goal_14, goal_15, goal_16, goal_17) %>%
  filter(funding > 0) %>%
  group_by(goal) %>%
  summarise(
    funding = sum(funding, na.rm = TRUE),
    performance = mean(six_overall_rating, na.rm = TRUE)
  ) %>%
  mutate(rank = rank(-funding, ties.method ="random")
  )

# rename goal numbers to goal names
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_1"] <- "No poverty"
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_2"] <- "Zero hunger"
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_3"] <- "Good health"
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_4"] <- "Quality education"
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_5"] <- "Gender equality"
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_6"] <- "Clean water/sanitation"
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_7"] <- "Affordable/clean energy"
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_8"] <- "Economic growth"
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_9"] <- "Industry/infra."
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_10"] <- "Reduced inequalities"
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_11"] <- "Sustainable cities"
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_12"] <- "Responsible consumption"
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_13"] <- "Climate Action"
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_14"] <- "Life below water"
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_15"] <- "Life on land"
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_16"] <- "Peace/justice & strong inst."
data_sdg_ghana$goal[data_sdg_ghana$goal == "goal_17"] <- "Partnerships for the goals"

# merge in Listening to Leaders survey data
ltl_ghana <- ltl %>% filter(CountryID == "Ghana") %>%
  mutate(rank = rank(-p, ties.method = "random"))

data_sdg_ghana <- merge(x=data_sdg_ghana, y=ltl_ghana,by.x="goal", by.y="q8_response", all.x = TRUE, all.y = TRUE)
data_sdg_ghana$rank.x[is.na(data_sdg_ghana$rank.x)] <- 17
data_sdg_ghana$rank.y[is.na(data_sdg_ghana$rank.y)] <- 17
data_sdg_ghana$discrete_performance = cut(data_sdg_ghana$performance, breaks= c(3, 3.5, 4, 4.5, 5, 5.5, 6))

ggplot(data_sdg_ghana, aes(x= rank.x, y = rank.y, fill = discrete_performance)) + 
  geom_point(shape = 21, size = 4) +
  geom_text(label= data_sdg_ghana$goal,nudge_y = 0.45, check_overlap = T, vjust="inward",hjust="inward", family = "Montserrat") +
  scale_fill_manual( values = rev(c("#125169", "#2699D0", "#a9d9ef","#F89E37", "#b83d05")), na.value="#424242") +
  scale_y_reverse(name = "Leader Priority", breaks = seq(1, 17, 1)) +
  scale_x_reverse(name = "Donor Priority", breaks = seq(1, 17, 1)) +
  labs(y = "Leader Priority", x = "Donor Priority", fill = "Average Performance", size = "Total Spending",
       title = "Ghanaian Leaders and Donors Diverge in Development Priorities", 
       subtitle = "Ghanian Leaders Prioritize Economic Growth, While Donors Prefer Funding Health Programs",
       caption = "Source: Project Performance Database (Honig 2018)")  +
  geom_abline(intercept = 0, slope = 1, color = "#4CA145") +
  #annotate("text", label = "Sources: Project Performance \nDatabase (Honig 2018), \nListening to Leaders \n(Custer et al 2018)", x = 2.5, y = 15, size = 3) +
  annotate("text", label = "Higher Donor Priority >>", x = 4, y = 17, size = 4, color = "#4CA145", fontface =2, family = "Montserrat") +
  annotate("text", label = "Higher Leader Priority >>", x = 17, y = 4, size = 4, color = "#4CA145", angle = 90, fontface=2, family = "Montserrat") +
  th

Ghanaian political and non-governmental development leaders diverge considerably from donors in their how they prioritize the 17 Sustainable Development Goals (measured through survey responses for leaders and by relative funding amounts for donors). The largest divergences can be seen in economic growth (which leaders ranked 1 and donors ranked 6) and good health (which leaders ranked 7 and donors ranked 1). We also see that the goals with the worst performance all more highly prioritized by donors than leaders (falling below the line which represents the axis of equal donor and leader prioritization). This illuminates a possible correlation between diverging prioritizatin and project performance that merits further exploration.

Plot 5: How does funding flow from donors to development priorities?

 data_sdg_Ghana <- data_sdg %>%
      filter(country_name == "Ghana" & completion_year > 2000) %>%
      select(aiddata_id, goal_1, goal_2, goal_3, goal_4, goal_5, goal_6, goal_7, goal_8, goal_9, goal_10, goal_11, goal_12, goal_13,
             goal_14, goal_15, goal_16, goal_17, six_overall_rating, performance_cat, satisfactory, donor) %>%
      gather(key = "goal", value = "funding", goal_1, goal_2, goal_3, goal_4, goal_5, goal_6, goal_7, goal_8, goal_9, goal_10, goal_11, goal_12, goal_13,
             goal_14, goal_15, goal_16, goal_17) %>%
      filter(funding > 0 & !is.na(satisfactory))
    
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_1"] <- "No poverty"
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_2"] <- "Zero hunger"
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_3"] <- "Good health"
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_4"] <- "Quality education"
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_5"] <- "Gender equality"
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_6"] <- "Clean water/sanitation"
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_7"] <- "Affordable/clean energy"
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_8"] <- "Economic growth"
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_9"] <- "Industry/infra."
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_10"] <- "Reduced inequalities"
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_11"] <- "Sustainable cities"
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_12"] <- "Responsible consumption"
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_13"] <- "Climate Action"
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_14"] <- "Life below water"
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_15"] <- "Life on land"
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_16"] <- "Peace/justice & strong inst."
    data_sdg_Ghana$goal[data_sdg_Ghana$goal == "goal_17"] <- "Partnerships for the goals"
    
    ltl_Ghana <- ltl %>% filter(CountryID == "Ghana") %>%
      mutate(rank = rank(-p, ties.method = "random"))
    
    data_sdg_Ghana <- merge(x=data_sdg_Ghana, y=ltl_Ghana,by.x="goal", by.y="q8_response", all.x = TRUE, all.y = TRUE)
    data_sdg_Ghana$rank[is.na(data_sdg_Ghana$rank)] <- 17
    data_sdg_Ghana$funding[is.na(data_sdg_Ghana$funding)] <- 0
    
    ggplot(data_sdg_Ghana, aes(y = funding, axis1 = donor, axis2 = reorder(goal, rank))) +
      geom_alluvium(aes(fill = as.factor(satisfactory))) +
      scale_fill_manual(values= c("#F69D30", "#2699D0")) +
      geom_stratum() +
      geom_label(stat = "stratum", label.strata = TRUE, family = "Montserrat") +
      scale_y_continuous(labels = comma) +
      scale_x_discrete(limits = c("Donor", "SDG"), expand = c(.1, .05)) +
       scale_linetype_manual(values = c("blank", "solid")) +
      labs(y = "Funding", fill = "Satisfactory",
       title = "The World Bank is the Dominant Funder in Ghana, Focusing on Health and Strong Institutions", 
       subtitle = "Ghana Satisfactory and Unsatisfactory Development Projects by Donor, SDG, and Leader Rank",
       caption = "Sources: Project Performance Database (Honig 2018), Listening to Leaders (Custer et al 2018)") +
       th

This chart illuminates that the World Bank is not only far and away the largest donor to Ghana since 2000, but also tends to fund fewer, higher cost projects in its most funded Sustainable Development Goals of good health and peace, justice, and strong institutions. However, a result of this is that a single large unsatisfactory World Bank health project dramatically changes the performance composition of the entire sector in Ghana. We also observe considerable specialization across donors, with DFID emerging as the dominant funder of quality education and sole funder of gender equality, and the World Bank dominating the good health goal and serving as the sole funder of affordable/clean energy.

Plot 6: Raincloud Plot- Do score distributions vary by evaluation type?

data%>%
  filter(!is.na(data$performance_cat) & external_evaluator %in% c("internal", "external", "independent eval office") & project_cost > 0 & project_cost < 500000000) %>%
  mutate(performane_cat = as.factor(performance_cat)) %>%
  ggplot(aes(x=performance_cat, y=project_cost, fill = fct_rev(performance_cat))) + 
    geom_flat_violin(position = position_nudge(x = .2, y = 0), alpha = .8) +
    geom_point(aes(y = project_cost, color = fct_rev(performance_cat)), 
             position = position_jitter(width = .15), size = .5, alpha = 0.8) +
    geom_boxplot(width = .1, outlier.shape = NA, alpha = 0.5) +
    #expand_limits(x = 5.25) +
    guides(fill = FALSE) +
    guides(color = FALSE) +
    scale_y_continuous(labels = comma, breaks = seq(0, 500000000, 100000000), expand = c(0,0)) +
    coord_flip() +
    #scale_x_continuous(expand = c(0,0)) +
    th +
    theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
    scale_fill_manual(values = c("#125169", "#2699D0", "#a9d9ef","#fabe7a", "#F89E37", "#b83d05"), na.value = "#424242") +
    scale_color_manual(values = c("#125169", "#2699D0", "#a9d9ef","#fabe7a", "#F89E37", "#b83d05"), na.value = "#424242") +
    facet_wrap(~external_evaluator, ncol = 3) +
    labs(y = "Project Performance Category", x = "Evaluation Type", fill = "Project Performance \nCategory",
       title = "Highest Cost Projects Slightly More Likely to Receive Top Ranking", 
       subtitle = "The highly satisfactory ranking has a higher density of more costly projects, perhaps signaling greater management quality for higher budget programs",
       caption = "Sources: Project Performance Database (Honig 2018)") +
       th

Does a larger project budget translate to better management and higher performance? Or are large-scale projects unweildy and difficult to manage? The graph above provides weak evidence that the group of projects that receive the highest performance ranking have a larger share of high-cost programs. However, we see by the overlapping box-plots across categories for all three evaluation types that this difference is likely insignificant. We also see that the most common evaluation type is by an independent evaluation office, which is driven by the large number World Bank and the Asian Development Bank projects that are evaluated by this method.

Fig 7: Where does the World Bank’s Money Go?

data_sdg_gather <- data_sdg %>%
      select(aiddata_id, goal_1, goal_2, goal_3, goal_4, goal_5, goal_6, goal_7, goal_8, goal_9, goal_10, goal_11, goal_12, goal_13,
             goal_14, goal_15, goal_16, goal_17, continent, satisfactory, donor, completion_year) %>%
      gather(key = "goal", value = "funding", goal_1, goal_2, goal_3, goal_4, goal_5, goal_6, goal_7, goal_8, goal_9, goal_10, goal_11,                  goal_12, goal_13, goal_14, goal_15, goal_16, goal_17) %>%
      filter(funding > 0 & !is.na(satisfactory) & donor == "WB" & completion_year >= 2000)

    data_sdg_gather$goal[data_sdg_gather$goal == "goal_1"] <- "Other"
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_2"] <- "Zero hunger"
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_3"] <- "Good health"
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_4"] <- "Quality education"
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_5"] <- "Other"
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_6"] <- "Clean water/sanitation"
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_7"] <- "Affordable/clean energy"
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_8"] <- "Economic growth"
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_9"] <- "Industry/infra."
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_10"] <- "Other"
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_11"] <- "Sustainable cities"
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_12"] <- "Other"
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_13"] <- "Other"
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_14"] <- "Other"
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_15"] <- "Other"
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_16"] <- "Peace/justice & strong inst."
    data_sdg_gather$goal[data_sdg_gather$goal == "goal_17"] <- "Other"
    
data_sdg_gather  %>%
  group_by(continent, goal) %>%
  summarise(
    funding = sum(funding),
    prop_satisfactory = mean(satisfactory)) %>%
    mutate(prop_satisfactory_factor = cut(prop_satisfactory, breaks = c(0, .5, .6, .7, .8, .9, 1))) %>%
    filter(continent != "New Zealand + Oceania") %>%
  
 ggplot(aes(area = funding, fill = prop_satisfactory_factor, label =goal,
                subgroup = continent)) +
  geom_treemap(color = "white", size = 3 , alpha = 1) +
  geom_treemap_text(colour = "white", place = "center", reflow = T, family= "Montserrat", fontface = "bold") +
  geom_treemap_subgroup_border(color = "white", size = 5) +
  geom_treemap_subgroup_text(place = "topleft", colour =
                             "white", fontface = "italic", family = "Montserrat") +
  scale_fill_manual(values = rev(c("#125169", "#2699D0", "#a9d9ef","#F89E37", "#b83d05"))) + th + 
  labs(fill = "Proportion Satisfactory \nProjects",
       title = "World Bank Projects Perform Worse in Africa Across Nearly All Sectors ", 
       subtitle = "Sustainable Cities and Industry and Infrastructure are two of the World Bank's top-fudned sectors\n 
       and also best performing across continents",
       caption = "Sources: Project Performance Database (Honig 2018)"
  )

The plot above shows the distribution of World Bank funding since 2000 by continent and Sustainable Development Goal. We clearly see that approximately half of World Bank funding has gone to Asia, where the Bank enjoys strong project performance across sectors. Africa is a different story- where at least 30% of projects are unsatisfactory across all goals except for Sustainable Cities, Clean Water and Sanitation, and Industry and Infrastructure. We also see that Health is an outlier in North America, with at least 30% of World Bank projects receiving unsatisfactory rankings.